<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Document</title>
  <style>
    
  </style>
</head>
<body>
  
</body>
<script>

  // function fn(n){
  //   this.name = n
  // }

  // const o1 = new fn("admin");
  // console.log(o1);

  // const o2 = new fn("root");
  // console.log(o2);

  // const o3 = fn("hahaha")
  // console.log(o3);


  function fn(n){
    this.name = n;
    console.log("函数被执行了")
  }

  fn.prototype.sayHi = function(){
    console.log("Hi, " + this.name)
  }

  const o1 = new fn("admin");
  console.log(o1);
  o1.sayHi()
  
  const o2 = new fn;
  console.log(o2);
  o2.sayHi()
  
  console.log(o1.sayHi === o2.sayHi);
  // new的原理
    // 1. 创建一个新对象（原料）
    // 2. 修改了原函数的this指向，指向这个新对象
    // 3. 修改这个新对象的原型指向，指向了函数的prototype
    // 4. 执行原函数所有代码
    // 5. 检测原函数是否主动返回对象，如果没有，则返回this


  
</script>
</html>